home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl -w
-
- use Gimp::Feature 'pdl';
- use Gimp 1.091;
- use Gimp::Fu;
- use PDL::LiteF;
-
- register "colour_to_alpha",
- "Converts the specified colour to alpha",
- "This replaces as much as possible of the specified colour in each pixel by a corresponding "
- ."amount of alpha, then readjusts the colour accordingly.",
- "Marc Lehmann",
- "Marc Lehmann <pcg\@goof.com>",
- "19990729",
- N_"<Image>/Filters/Colors/Colour To Alpha...",
- "RGB*",
- [
- [PF_COLOR, "colour", "The colour to replace"],
- ],
- sub { # es folgt das eigentliche Skript...
- my($image,$drawable,$colour)=@_;
-
- $drawable->is_layer or die "colour_to_alpha only works with layers\n";
- $drawable->add_alpha unless $drawable->has_alpha;
-
- Gimp->progress_init ("Replacing colour...");
-
- my @bounds = $drawable->bounds;
- {
- # $src and $dst must either be scoped or explicitly undef'ed
- # before merge_shadow.
- my $src = new PixelRgn $drawable,@bounds,0,0;
- my $dst = new PixelRgn $drawable,@bounds,1,1;
-
- $iter = Gimp->pixel_rgns_register ($src, $dst);
-
- do {
- # get the pixels ($pixels will be modified in-place!)
- $pixels = $src->data;
-
- # extract the rgb portion only
- $rgb = $pixels->slice("0:2");
-
- # calculate difference to destination colour
- $diff = 255 + minimum $rgb - pdl $colour;
-
- # adjust alpha part
- my $alpha = $pixels->slice("(3)");
- $alpha .= 255-$diff;
-
- # adjust the colour
- my $a = ($diff/(255**2))->slice("*3") * pdl $colour;
- $rgb .= 255-(255-$rgb) / (1-$a);
-
- # write the pixels into dst
- $dst->data($pixels);
-
- Gimp->progress_update (($src->y-$bounds[1])/$bounds[2]);
- } while (Gimp->pixel_rgns_process ($iter));
- }
- Gimp->progress_update (1);
-
- $drawable->merge_shadow (1);
- $drawable->update ($drawable->bounds);
-
- (); # wir haben kein neues Bild erzeugt
- };
-
- exit main;
-
-
-
-
-
-
-
-
-
-
-